home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 051-075 / 056 / getdisks / getdisks.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  4KB  |  147 lines

  1. /* getdisks.c - Grab all available disk devices and return them to you in a
  2.  *         simple exec list. The list is made up of named nodes--the "names"
  3.  *         being the device name. 
  4.  *
  5.  *      Phillip Lindsay (c) 1987 Commodore-Amiga Inc. 
  6.  * You may use this source as long as the copyright notice is left intact.
  7.  */
  8. #include <exec/types.h>
  9. #include <exec/nodes.h>
  10. #include <exec/lists.h>
  11. #include <exec/memory.h>
  12. #include <libraries/dos.h>
  13. #include <libraries/dosextens.h>
  14. #include <libraries/filehandler.h>
  15.  
  16. #ifdef MANX
  17. #include <functions.h>
  18. #include <stdio.h>
  19. #else
  20. #include <lattice/stdio.h>
  21. #endif
  22.  
  23. extern struct DosLibrary *DOSBase;
  24.  
  25. /* btoc() takes a pointer to a string in BCPL format and converts it to a
  26.  * C string.
  27.  */
  28. void *btoc(bstring)
  29. char *bstring;
  30. {
  31.  register UBYTE len,count,*cstring; 
  32.  
  33.  cstring = (UBYTE *) bstring;
  34.  len = cstring[0];              
  35.  for(count=0;count < len;count++)
  36.   cstring[count] = cstring[count+1];
  37.  cstring[count] = '\0';
  38. }
  39.  
  40. /* GetNode() will build a node structure for you. It will append memory to the
  41.  *     node structure for the node name passed.
  42.  */       
  43. struct Node *GetNode(name,type,pri)
  44. char *name;
  45. UBYTE type,pri;
  46. {
  47.  register struct Node *mynode;
  48.  register char        *myname;
  49.  register UBYTE          *mymemory;
  50.  register ULONG          mynamesize;
  51.  
  52.  mynamesize =( ((ULONG)strlen(name)) ? (ULONG)strlen(name)+1 : 0L );   
  53.  
  54.  mymemory = (UBYTE *) 
  55.   AllocMem((ULONG)sizeof(*mynode)+mynamesize,MEMF_PUBLIC | MEMF_CLEAR); 
  56.  
  57.  if(!mymemory) return((struct Node *)NULL);
  58.  
  59.  mynode = (struct Node *) mymemory; 
  60.  if(mynamesize)
  61.   {
  62.    myname = (char *) mymemory+(ULONG)sizeof(*mynode);
  63.    strcpy(myname,name);
  64.    mynode->ln_Name = myname;
  65.   }
  66.  mynode->ln_Type = type;
  67.  mynode->ln_Pri  = pri;
  68.  
  69.  return(mynode);
  70. }
  71.  
  72. /* This function assumes you used GetNode() for node initialization. Will
  73.  *     free all memory used by node. Make sure you remove node from any list. 
  74.  */
  75. void FreeNode(mynode)
  76. struct Node *mynode;
  77. {
  78.  register ULONG mymemsize;
  79.  
  80.  mymemsize = (ULONG) sizeof(*mynode);
  81.  mymemsize+= ((mynode->ln_Name) ? (ULONG)strlen(mynode->ln_Name)+1 : 0L);
  82.  
  83.  FreeMem(mynode,mymemsize);
  84. }
  85.  
  86.  
  87. /* getdisks() will grab all disk device names in the system device list and
  88.  *  append an exec node to a given list. The node being named in respect to the
  89.  *  device.  
  90.  */
  91. void getdisks(dlist)
  92. struct List *dlist;    /* passed a pointer to a initialize exec list */ 
  93. {
  94.  extern struct DosLibrary       *DOSBase;
  95.  struct RootNode            *rnode; 
  96.  struct DosInfo                *dinfo;
  97.  register struct DeviceNode      *dnode;
  98.  register struct Node           *adisk;
  99.  char      *bname,name[32];
  100.  
  101.  rnode   = (struct RootNode *)  DOSBase->dl_Root;
  102.  dinfo   = (struct DosInfo  *)  BADDR(rnode->rn_Info);
  103.  
  104.  Forbid();
  105.  for(dnode = (struct DeviceNode *) BADDR(dinfo->di_DevInfo);BADDR(dnode);
  106.      dnode = (struct DeviceNode *) BADDR(dnode->dn_Next))
  107.   {
  108.    if(!dnode->dn_Type && dnode->dn_Task && BADDR(dnode->dn_Name)) 
  109.     {
  110.      bname = (char *) BADDR(dnode->dn_Name);    
  111.      movmem(bname,name,(ULONG)bname[0]+1L);
  112.      btoc(name);
  113.      if((adisk=GetNode(name,0,0))) AddTail(dlist,adisk);    
  114.     }
  115.   }
  116.  Permit(); 
  117. }
  118.  
  119. /* freedisks() will free all nodes in a given list. Function assumes nodes where
  120.  *    initialized with GetNode().
  121.  */
  122. void freedisks(dlist)
  123. struct List *dlist;
  124. {
  125.  register struct Node *disk;
  126.  
  127.  while((disk=RemTail(dlist)))
  128.   FreeNode(disk);
  129. }
  130.  
  131.  
  132. main()
  133. {
  134.  struct List disks;
  135.  struct Node *disk;
  136.   
  137.  NewList(&disks);    /* Initialize list header */
  138.  getdisks(&disks);    /* Fill list */
  139.  
  140. /* print any devices in list.... if any */
  141.  if(disks.lh_TailPred != &disks)
  142.    for(disk = disks.lh_Head;disk->ln_Succ;disk=disk->ln_Succ)
  143.      puts(disk->ln_Name);
  144.  
  145.  freedisks(&disks);
  146. }
  147.